From e207cc255580652487cbfad7597b69b248f6efb9 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild2.aw" Date: Thu, 4 Jan 2007 16:14:22 -0700 Subject: [PATCH] [IA64] Enable fast hyperprivop for ssm.i and rfi Signed-off-by: Anthony Xu --- xen/arch/ia64/asm-offsets.c | 1 + xen/arch/ia64/xen/hyperprivop.S | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/xen/arch/ia64/asm-offsets.c b/xen/arch/ia64/asm-offsets.c index e0f502f662..efd68306d0 100644 --- a/xen/arch/ia64/asm-offsets.c +++ b/xen/arch/ia64/asm-offsets.c @@ -60,6 +60,7 @@ void foo(void) DEFINE(IA64_VCPU_META_SAVED_RR0_OFFSET, offsetof (struct vcpu, arch.metaphysical_saved_rr0)); DEFINE(IA64_VCPU_BREAKIMM_OFFSET, offsetof (struct vcpu, arch.breakimm)); DEFINE(IA64_VCPU_IVA_OFFSET, offsetof (struct vcpu, arch.iva)); + DEFINE(IA64_VCPU_EVENT_CALLBACK_IP_OFFSET, offsetof (struct vcpu, arch.event_callback_ip)); DEFINE(IA64_VCPU_IRR0_OFFSET, offsetof (struct vcpu, arch.irr[0])); DEFINE(IA64_VCPU_IRR3_OFFSET, offsetof (struct vcpu, arch.irr[3])); DEFINE(IA64_VCPU_INSVC3_OFFSET, offsetof (struct vcpu, arch.insvc[3])); diff --git a/xen/arch/ia64/xen/hyperprivop.S b/xen/arch/ia64/xen/hyperprivop.S index 763f66b072..9d6d418784 100644 --- a/xen/arch/ia64/xen/hyperprivop.S +++ b/xen/arch/ia64/xen/hyperprivop.S @@ -37,10 +37,10 @@ # define FAST_BREAK # undef FAST_ACCESS_REFLECT //XXX TODO fast_access_reflect // doesn't support dom0 vp yet. -//# define FAST_RFI +# define FAST_RFI // TODO: Since we use callback to deliver interrupt, // FAST_SSM_I needs to be rewritten. -//# define FAST_SSM_I +# define FAST_SSM_I # define FAST_PTC_GA # undef RFI_TO_INTERRUPT // not working yet #endif @@ -282,13 +282,11 @@ ENTRY(hyper_ssm_i) adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r21]=r20 ;; // leave cr.ifs alone for later rfi - // set iip to go to domain IVA break instruction vector + // set iip to go to event callback handler movl r22=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r22=[r22];; - adds r22=IA64_VCPU_IVA_OFFSET,r22;; - ld8 r23=[r22];; - movl r24=0x3000;; - add r24=r24,r23;; + adds r22=IA64_VCPU_EVENT_CALLBACK_IP_OFFSET,r22;; + ld8 r24=[r22];; mov cr.iip=r24;; // OK, now all set to go except for switch to virtual bank0 mov r30=r2 @@ -1027,8 +1025,12 @@ ENTRY(hyper_rfi) adds r20=XSI_IPSR_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r21=[r20];; // r21 = vcr.ipsr extr.u r22=r21,IA64_PSR_I_BIT,1 ;; - mov r30=r22 + mov r30=r22;; // r30 determines whether we might deliver an immediate extint +#ifndef RFI_TO_INTERRUPT // see beginning of file + cmp.ne p6,p0=r30,r0 +(p6) br.cond.spnt.few dispatch_break_fault ;; +#endif 1: adds r20=XSI_IPSR_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r21=[r20];; // r21 = vcr.ipsr @@ -1063,10 +1065,6 @@ ENTRY(hyper_rfi) cmp.ltu p0,p7=r22,r23 ;; // if !(iip=high) (p7) br.spnt.few dispatch_break_fault ;; -#ifndef RFI_TO_INTERRUPT // see beginning of file - cmp.ne p6,p0=r30,r0 -(p6) br.cond.spnt.few dispatch_break_fault ;; -#endif 1: // OK now, let's do an rfi. #ifdef FAST_HYPERPRIVOP_CNT -- 2.30.2